
package com.thinkgem.jeesite.common.pojo.auth.access.process;

import java.util.Iterator;
import java.util.List;

import com.fr.bi.cube.engine.third.edu.emory.mathcs.backport.java.util.Arrays;
import com.thinkgem.jeesite.common.pojo.auth.access.ic.AccessProcess;
import com.thinkgem.jeesite.common.pojo.auth.access.type.Relation;

/** 
 * 访问处理器抽象类,需要实现注解检查方法
 *
 */
public abstract class AnnoProcess implements AccessProcess {

	// 获取当前session的用户信息,得到它的roleId,用户所属officeCode
	//User user = UserUtils.getUser();

	/**
	 * 注解"或"逻辑检查:有一个通过就算true,全不通过才算false
	 * @param annoList 注解值列表
	 * @param curList  当前值列表
	 * @param defValue 默认值
	 * @return 检查是否通过
	 * 2015年5月23日
	 */
	protected Boolean orCheck(String[] annoList,List<?> curList,String defValue){
		Boolean checking = false; //默认检查不通过
		if(annoList != null){ //anno项不为空时才做检测
		    if(!annoList.equals(defValue)){ //annolist不等于默认值时处理
	            if(curList != null){
	                for(String annos:annoList){
	                    if(curList.contains(annos)){ //有一个通过即为通过
	                        checking = true;
	                        break;//符合后直接退出
	                    } 
	                }
	            }
		    } else { //!!annolist等于默认值时按照no pass直接返回(保留冗余)!!
	            checking = false;
		    }
		}
		return checking;
	}

	/**
	 * 注解"与"逻辑检查:所有项全部通过才算true,有一个不通过即为false.
	 * @param annoList 注解值列表
	 * @param curList  当前值列表
	 * @param defValue 默认值
	 * @return 检查是否通过
	 * 2015年5月23日
	 */
	protected Boolean andCheck(String[] annoList,List<?> curList,String defValue){
		Boolean checking = true; //默认检查通过
		if(annoList != null){
		    if(!annoList.equals(defValue)){   //annolist不等于默认值时处理
	            if(curList != null){
	                for(String annos:annoList){
	                    if(!curList.contains(annos)){ //所有通过才算通过
	                        checking = false;//有一个不通过就算不通过
	                        break;//符合后直接退出
	                    } 
	                }
	            }
		    } else { //!!annolist等于默认值时按照pass直接返回(保留冗余)!!
	            checking = true;
		    }
		}
		return checking;
	}

	/**
	 * 注解"关联关系"检查
	 * @param rt       关联关系(与,或)
	 * @param natiTag  原检查项
	 * @param tarTag   目标检查项
	 * @return 检查结果
	 * 2015年5月23日
	 */
	public static Boolean relationCheck(Relation rt,Boolean natiTag,Boolean tarTag){
		switch (rt) {
		case  OR:return natiTag || tarTag;
		case AND:return natiTag && tarTag;
		default:return natiTag || tarTag;
		}
	}

	/**
	 * 注解"关联关系"检查(关系比较参数在两个以上)
	 * @param rt           关联关系(与,或)
	 * @param tagParams    相关检查项
	 * @return 检查结果
	 * 2015年5月23日
	 */
	protected Boolean relationCheck(Relation rt,Boolean... tagParams){
		if(1 < tagParams.length ){
			Iterator<?> iter = Arrays.asList(tagParams).iterator();
			Boolean curTag = (Boolean)iter.next();
			while (iter.hasNext()) {
				curTag = relationCheck(rt,curTag,(Boolean)iter.next());
	        }
			return curTag;
		} else{
			return tagParams[0];//小于两个参数时直接返回tag参数值.
		}
	}

}
